home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / icon_utl / iconmorf / iconmorf.bas < prev    next >
BASIC Source File  |  1995-11-20  |  32KB  |  1,099 lines

  1. Option Explicit
  2.  
  3.  ' Constants:
  4.   Global Const BLACKNESS = &H42&                       ' copy blackness
  5.   Global Const SRCCOPY = &HCC0020                      ' copy source
  6.   
  7.   Global Const glICON_CELL = 34&                       ' size of icon cell
  8.   Global Const gnTYPE_BAD = 0                          ' file is not icon or bitmap
  9.   Global Const gnTYPE_ICON = 1                         ' file is an icon
  10.   Global Const gnTYPE_BITMAP = 2                       ' file is a bitmap
  11.   Global Const gsDELETED = "[Deleted]"                 ' deleted entry
  12.  
  13.  ' Types:
  14.   
  15.   ' icon reference
  16.   Type IconType
  17.     nIndex                             As Integer      ' index number
  18.   End Type
  19.  
  20.  ' Variables:
  21.   Global gbLoading                     As Integer      ' doing loading process
  22.   Global gbWarning                     As Integer      ' show override warning
  23.   Global gnBMP                         As Integer      ' bitmap to save
  24.   Global gnBMPx(0 To 5)                As Integer      ' bitmap width
  25.   Global gnBMPy(0 To 5)                As Integer      ' bitmap height
  26.   Global gnFilter                      As Integer      ' list filter option
  27.   Global gnFirstIcon                   As Integer      ' first icon displayed in viewer
  28.   Global gnHeightViewerMin             As Integer      ' minimum viewer height
  29.   Global gnHeightViewerNew             As Integer      ' minimum viewer width
  30.   Global gnIconCols                    As Integer      ' number of columns of icons
  31.   Global gnIconRows                    As Integer      ' number of rows of icons
  32.   Global gnIconsMax                    As Integer      ' maximum number of icons to display
  33.   Global gnLastIcon                    As Integer      ' last icon displayed in viewer
  34.   Global gnWidthViewerMin              As Integer      ' minimum viewer width
  35.   Global gnWidthViewerNew              As Integer      ' new viewer width\
  36.   Global gtIcon(0 To 1199)             As IconType     ' icon information
  37.  
  38. Sub zzBordersToggle ()
  39.   
  40.   ' show and hide borders
  41.   frmMorph!mnuOpBorders.Checked = Not frmMorph!mnuOpBorders.Checked
  42.   frmMorph!shpSelectedIcon.Visible = frmMorph!mnuOpBorders.Checked
  43.   frmMorph!shpMorph(0).Visible = frmMorph!mnuOpBorders.Checked
  44.   frmMorph!shpMorph(1).Visible = frmMorph!mnuOpBorders.Checked
  45.   frmMorph!shpMorph(2).Visible = frmMorph!mnuOpBorders.Checked
  46.   frmMorph!shpMorph(3).Visible = frmMorph!mnuOpBorders.Checked
  47.   frmMorph!shpMorph(4).Visible = frmMorph!mnuOpBorders.Checked
  48.   frmMorph!shpMorph(5).Visible = frmMorph!mnuOpBorders.Checked
  49.  
  50. End Sub
  51.  
  52. Sub zzClearIcon ()
  53.   
  54.   ' clear icon
  55.   frmMorph!picSelectedIcon.Picture = LoadPicture()
  56.   frmMorph!picMorph(0).Picture = LoadPicture()
  57.   frmMorph!picMorph(1).Picture = LoadPicture()
  58.   frmMorph!picMorph(2).Picture = LoadPicture()
  59.   frmMorph!picMorph(3).Picture = LoadPicture()
  60.   frmMorph!picMorph(4).Picture = LoadPicture()
  61.   frmMorph!picMorph(5).Picture = LoadPicture()
  62.  
  63. End Sub
  64.  
  65. Sub zzCopyIcon ()
  66.  
  67.  ' Description:
  68.  '  delete selected icon
  69.  
  70.  ' Variables:
  71.   Dim s1             As String
  72.   Dim sFile          As String
  73.  
  74.   ' handle errors
  75.   On Error Resume Next
  76.   
  77.   ' if entry selected
  78.   If frmMorph!lstFiles.ListIndex >= 0 Then
  79.  
  80.     ' if not deleted
  81.     If frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex) <> gsDELETED Then
  82.     
  83.       ' setup file path and name
  84.       sFile = zzPathFormat(frmMorph!filList.Path) & frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex)
  85.       
  86.       ' if the file exists
  87.       If zzFileExists(sFile) Then
  88.   
  89.         ' load form
  90.         Load frmDirectory
  91.   
  92.         ' setup caption
  93.         frmDirectory.Caption = "Copy " & UCase$(frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex)) & " to..."
  94.   
  95.         ' reset directory
  96.         If frmMorph.Tag <> gsEMPTY Then
  97.           frmDirectory!dirList.Path = frmMorph.Tag
  98.           frmMorph.Tag = gsEMPTY
  99.         End If
  100.   
  101.         ' give user option to choose directory
  102.         frmDirectory.Show MODAL
  103.   
  104.         ' if directory selected
  105.         If frmMorph.Tag <> gsEMPTY Then
  106.     
  107.           ' reset error flag
  108.           Err = 0
  109.           
  110.           ' copy file
  111.           s1 = zzPathFormat(frmMorph.Tag) & frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex)
  112.           FileCopy sFile, s1
  113.           
  114.           ' tell user of error
  115.           If Err <> 0 Then
  116.             s1 = UCase$(frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex)) & " could not be copyed to "
  117.             s1 = s1 & UCase$(frmMorph.Tag) & " because of a """ & Error$ & """ error."
  118.             MsgBox s1, MB_ICONSTOP
  119.           End If
  120.   
  121.         End If
  122.         
  123.       ' tell user cannot find
  124.       Else
  125.         MsgBox UCase$(sFile) & " icon not found.", MB_ICONSTOP
  126.       End If
  127.  
  128.     ' tell user already deleted
  129.     Else
  130.       MsgBox "Icon has been deleted.", MB_ICONSTOP
  131.     End If
  132.   
  133.   End If
  134.  
  135. End Sub
  136.  
  137. Sub zzDeleteIcon ()
  138.  
  139.  ' Description:
  140.  '  delete selected icon
  141.  
  142.  ' Variables:
  143.   Dim nX             As Integer
  144.   Dim nR             As Integer
  145.   Dim s1             As String
  146.   Dim sFile          As String
  147.  
  148.   ' handle errors
  149.   On Error Resume Next
  150.   
  151.   ' if entry selected
  152.   If frmMorph!lstFiles.ListIndex >= 0 Then
  153.  
  154.     ' setup index reference
  155.     nX = frmMorph!lstFiles.ListIndex
  156.  
  157.     ' setup file path and name
  158.     sFile = zzPathFormat(frmMorph!filList.Path) & frmMorph!lstFiles.List(nX)
  159.     
  160.     ' if the file exists
  161.     If zzFileExists(sFile) Then
  162.  
  163.       ' is user warning flag on
  164.       If frmMorph!mnuOpDeleteWarn.Checked Then
  165.  
  166.         ' give user chance to abort
  167.         s1 = "Delete " & UCase$(sFile) & " file?"
  168.         If MsgBox(s1, MB_ICONQUESTION Or MB_YESNO) <> IDYES Then Exit Sub
  169.  
  170.       End If
  171.       
  172.       ' delete selected entry
  173.       Kill sFile
  174.       
  175.       ' tell user of error
  176.       If Err <> 0 Then
  177.         MsgBox Error$
  178.       
  179.       ' no error so
  180.       Else
  181.         
  182.         ' replace name with deleted flag
  183.         frmMorph!lstFiles.List(nX) = gsDELETED
  184.  
  185.         ' fade to black
  186.         If nX < 400 Then
  187.           nR = BitBlt(frmMorph!picStorage(0).hDC, 2 + nX * glICON_CELL, 0, 32, 32, 0, 0, 0, BLACKNESS)
  188.         ElseIf nX < 800 Then
  189.           nR = BitBlt(frmMorph!picStorage(1).hDC, 2 + (nX - 400) * glICON_CELL, 0, 32, 32, 0, 0, 0, BLACKNESS)
  190.         ElseIf nX < 1200 Then
  191.           nR = BitBlt(frmMorph!picStorage(2).hDC, 2 + (nX - 800) * glICON_CELL, 0, 32, 32, 0, 0, 0, BLACKNESS)
  192.         End If
  193.  
  194.         ' redisplay to shown "blackened" one
  195.         Call zzDisplayIcons
  196.         
  197.         ' if not at end of list
  198.         If nX < frmMorph!lstFiles.ListCount - 1 Then
  199.           
  200.           ' move toward end until entry that is not deleted is found
  201.           Do
  202.             If frmMorph!lstFiles.ListIndex < frmMorph!lstFiles.ListCount - 1 Then
  203.               frmMorph!lstFiles.ListIndex = frmMorph!lstFiles.ListIndex + 1
  204.             Else
  205.               If frmMorph!lstFiles.ListCount > 0 Then
  206.                 frmMorph!lstFiles.ListIndex = 0
  207.               Else
  208.                 frmMorph!lstFiles.ListIndex = -1
  209.               End If
  210.               Exit Do
  211.             End If
  212.           Loop Until frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex) <> gsDELETED
  213.         
  214.         ' if at end of list then
  215.         ' go back to top
  216.         Else
  217.           If frmMorph!lstFiles.ListCount > 0 Then
  218.             frmMorph!lstFiles.ListIndex = 0
  219.           Else
  220.             frmMorph!lstFiles.ListIndex = -1
  221.           End If
  222.         End If
  223.  
  224.       End If
  225.       
  226.     ' tell user already deleted
  227.     Else
  228.       MsgBox "File already deleted.", MB_ICONSTOP
  229.     End If
  230.   
  231.   End If
  232.  
  233. End Sub
  234.  
  235. Sub zzDeleteIcons ()
  236.  
  237.  ' Description:
  238.  '  Delete All icons
  239.  
  240.  ' Variables:
  241.   Dim bDelFlag  As Integer     ' save warning flag
  242.   Dim nX        As Integer     ' loop counter
  243.   
  244.   ' change to path
  245.   ChDrive frmMorph!drvList.Drive
  246.   ChDir frmMorph!filList.Path
  247.  
  248.   ' ask user if they are sure
  249.   If MsgBox("Are you sure you wish to delete all listed files?", MB_ICONQUESTION Or MB_YESNO Or MB_DEFBUTTON2) = IDYES Then
  250.  
  251.     ' ask user if they are sure
  252.     If MsgBox("Once again, are you absolutely sure you wish to delete all listed files?", MB_ICONQUESTION Or MB_YESNO Or MB_DEFBUTTON2) = IDYES Then
  253.  
  254.       ' setup warning option
  255.       bDelFlag = frmMorph!mnuOpDeleteWarn.Checked
  256.       If frmMorph!mnuOpDeleteWarn.Checked Then
  257.         frmMorph!mnuOpDeleteWarn.Checked = MsgBox("Do you wish to display a warning message before deleting each file?", MB_ICONQUESTION Or MB_YESNO Or MB_DEFBUTTON2) = IDYES
  258.       End If
  259.  
  260.       ' please wait...
  261.       Screen.MousePointer = HOURGLASS
  262.     
  263.       ' make sure above all other forms
  264.       zzFormFloat frmMorph
  265.       
  266.       ' if each icon in list
  267.       For nX = 0 To frmMorph!lstFiles.ListCount - 1
  268.         
  269.         ' if valid icon then
  270.         If zzFileType(frmMorph!lstFiles.List(nX), True) <> gnTYPE_BAD Then
  271.           
  272.           ' set list index
  273.           frmMorph!lstFiles.ListIndex = nX
  274.           
  275.           ' delete icon
  276.           Call zzDeleteIcon
  277.           
  278.         End If
  279.     
  280.       Next nX
  281.     
  282.       ' sink back
  283.       If Not frmMorph!mnuOpFloat.Checked Then
  284.         zzFormUnfloat frmMorph
  285.       End If
  286.       
  287.       ' ...done
  288.       Screen.MousePointer = DEFAULT
  289.     
  290.       ' set to first icon
  291.       If frmMorph!lstFiles.ListCount > 0 Then
  292.         frmMorph!lstFiles.ListIndex = -1
  293.         frmMorph!lstFiles.ListIndex = 0
  294.       End If
  295.  
  296.       ' reset warning flag
  297.       frmMorph!mnuOpDeleteWarn.Checked = bDelFlag
  298.  
  299.       ' refresh all icons
  300.       Call zzRefreshIcons
  301.  
  302.     End If
  303.  
  304.   End If
  305.  
  306. End Sub
  307.  
  308. Sub zzDisplayIcons ()
  309.  
  310.  ' Description:
  311.  '  Display icons
  312.  
  313.  ' Variables:
  314.   Dim nCurCol             As Integer
  315.   Dim nCurRow             As Integer
  316.   Dim nPixelWidth         As Integer
  317.   Dim nIcon               As Integer
  318.   Dim nR                  As Integer
  319.  
  320.   ' clear viewing area
  321.   frmViewer!picIcons.Cls
  322.     
  323.   ' Determine what icon should be the first icon displayed (Upper left hand
  324.   ' corner of viewing window) based on the current value of the Scrollbar.
  325.   gnFirstIcon = frmViewer!vsbIcons.Value * gnIconCols
  326.   
  327.   ' calculate last icon
  328.   gnLastIcon = gnFirstIcon + (gnIconRows * gnIconCols) + gnIconCols
  329.   If gnLastIcon > frmMorph!lstFiles.ListCount - 1 Then
  330.     gnLastIcon = frmMorph!lstFiles.ListCount - 1
  331.   End If
  332.  
  333.   ' for each icon in the loop
  334.   For nIcon = gnFirstIcon To gnLastIcon
  335.  
  336.       ' calculate current column and row
  337.       nCurRow = (nIcon - gnFirstIcon) \ gnIconCols
  338.       nCurCol = (nIcon - gnFirstIcon) Mod gnIconCols
  339.  
  340.       ' copy from first storage area
  341.       If nIcon < 400 Then
  342.         nR = BitBlt(frmViewer!picIcons.hDC, nCurCol * glICON_CELL, nCurRow * glICON_CELL, glICON_CELL, glICON_CELL, frmMorph!picStorage(0).hDC, 2 + nIcon * glICON_CELL, 0, SRCCOPY)
  343.       
  344.       ' copy from second storage area
  345.       ElseIf nIcon < 800 Then
  346.         nR = BitBlt(frmViewer!picIcons.hDC, nCurCol * glICON_CELL, nCurRow * glICON_CELL, glICON_CELL, glICON_CELL, frmMorph!picStorage(1).hDC, 2 + (nIcon - 400) * glICON_CELL, 0, SRCCOPY)
  347.       
  348.       ' copy from third storage area
  349.       ElseIf nIcon < 1200 Then
  350.         nR = BitBlt(frmViewer!picIcons.hDC, nCurCol * glICON_CELL, nCurRow * glICON_CELL, glICON_CELL, glICON_CELL, frmMorph!picStorage(2).hDC, 2 + (nIcon - 800) * glICON_CELL, 0, SRCCOPY)
  351.       End If
  352.   
  353.   Next nIcon
  354.  
  355. End Sub
  356.  
  357. Function zzFileType (ByVal sFileName$, ByVal bPrompt%) As Integer
  358.  
  359.  ' Description:
  360.  '  Is file a valid icon or bitmap
  361.  
  362.  ' Parameters:
  363.  '  sFileName           file name (including path)
  364.  '  bPrompt             display prompt if bad
  365.  
  366.  ' Variables:
  367.   Dim s1 As String
  368.  
  369.   ' handle errors
  370.   On Error Resume Next
  371.   Err = False
  372.  
  373.   ' if file has been deleted
  374.   If sFileName <> gsDELETED Then
  375.     
  376.     ' set drag icon which will error if not valid icon
  377.     
  378.     ' if loading only icons then setting the drag icon
  379.     ' to the image will determine if it is an icon or not
  380.     If gnFilter = 0 Then
  381.       
  382.       ' see if icon
  383.       frmMorph!picSelectedIcon.DragIcon = LoadPicture(sFileName)
  384.       If Err = False Then
  385.         zzFileType = gnTYPE_ICON
  386.       Else
  387.         zzFileType = gnTYPE_BAD
  388.         If bPrompt Then MsgBox UCase$(sFileName) & " is not an icon file.", MB_ICONSTOP
  389.       End If
  390.       
  391.     ' bitmaps
  392.     ElseIf gnFilter = 1 Then
  393.  
  394.       ' see if bitmap
  395.       frmMorph!picBitmap.Picture = LoadPicture(sFileName)
  396.       If Err = False Then
  397.  
  398.         ' must be smaller than 32x32
  399.         If frmMorph!picBitmap.Width > 32 Then
  400.           zzFileType = gnTYPE_BAD
  401.           If bPrompt Then
  402.             s1 = UCase$(sFileName) & " is "
  403.             s1 = s1 & Format$(frmMorph!picBitmap.Width) & " x "
  404.             s1 = s1 & Format$(frmMorph!picBitmap.Height) & " pixels"
  405.             s1 = s1 & " which is too large to process."
  406.             MsgBox s1, MB_ICONSTOP
  407.           End If
  408.         ElseIf frmMorph!picBitmap.Width > 32 Then
  409.           zzFileType = gnTYPE_BAD
  410.           If bPrompt Then
  411.             s1 = UCase$(sFileName) & " is "
  412.             s1 = s1 & Format$(frmMorph!picBitmap.Width) & " x "
  413.             s1 = s1 & Format$(frmMorph!picBitmap.Height) & " pixels"
  414.             s1 = s1 & " which is too large to process."
  415.             MsgBox s1, MB_ICONSTOP
  416.           End If
  417.         Else
  418.           zzFileType = gnTYPE_BITMAP
  419.         End If
  420.         
  421.       ' not bitmap at all
  422.       Else
  423.         zzFileType = gnTYPE_BAD
  424.         If bPrompt Then MsgBox UCase$(sFileName) & " is not a bitmap file.", MB_ICONSTOP
  425.       End If
  426.       
  427.     ' all files
  428.     ElseIf gnFilter = 2 Or gnFilter = 3 Then
  429.       
  430.       ' see if icon
  431.       frmMorph!picSelectedIcon.DragIcon = LoadPicture(sFileName)
  432.       If Err = False Then
  433.         zzFileType = gnTYPE_ICON
  434.       
  435.       ' see if bitmap
  436.       Else
  437.         
  438.         ' see if bitmap
  439.         Err = False
  440.         frmMorph!picBitmap.Picture = LoadPicture(sFileName)
  441.         If Err = False Then
  442.  
  443.           ' must be smaller than 32x32
  444.           If frmMorph!picBitmap.Width > 32 Then
  445.             zzFileType = gnTYPE_BAD
  446.             If bPrompt Then
  447.               s1 = UCase$(sFileName) & " is "
  448.               s1 = s1 & Format$(frmMorph!picBitmap.Width) & " x "
  449.               s1 = s1 & Format$(frmMorph!picBitmap.Height) & " pixels"
  450.               s1 = s1 & " which is too large to process."
  451.               MsgBox s1, MB_ICONSTOP
  452.             End If
  453.           ElseIf frmMorph!picBitmap.Width > 32 Then
  454.             zzFileType = gnTYPE_BAD
  455.             If bPrompt Then
  456.               s1 = UCase$(sFileName) & " is "
  457.               s1 = s1 & Format$(frmMorph!picBitmap.Width) & " x "
  458.               s1 = s1 & Format$(frmMorph!picBitmap.Height) & " pixels"
  459.               s1 = s1 & " which is too large to process."
  460.               MsgBox s1, MB_ICONSTOP
  461.             End If
  462.           Else
  463.             zzFileType = gnTYPE_BITMAP
  464.           End If
  465.         
  466.         ' not bitmap at all
  467.         Else
  468.           zzFileType = gnTYPE_BAD
  469.           If bPrompt Then MsgBox UCase$(sFileName) & " is not an icon or bitmap file.", MB_ICONSTOP
  470.         End If
  471.         
  472.       End If
  473.     
  474.     End If
  475.  
  476.   ' file has been deleted
  477.   Else
  478.     zzFileType = gnTYPE_BAD
  479.   End If
  480.  
  481. End Function
  482.  
  483. Sub zzGreyToggle ()
  484.  
  485.   ' toggle switch
  486.   frmMorph!mnuOpGrey.Checked = Not frmMorph!mnuOpGrey.Checked
  487.  
  488.   ' use grey background
  489.   If frmMorph!mnuOpGrey.Checked Then
  490.     frmMorph!picSelectedIcon.BackColor = BUTTON_GRAY
  491.     frmMorph!picMorph(0).BackColor = BUTTON_GRAY
  492.     frmMorph!picMorph(1).BackColor = BUTTON_GRAY
  493.     frmMorph!picMorph(2).BackColor = BUTTON_GRAY
  494.     frmMorph!picMorph(3).BackColor = BUTTON_GRAY
  495.     frmMorph!picMorph(4).BackColor = BUTTON_GRAY
  496.     frmMorph!picMorph(5).BackColor = BUTTON_GRAY
  497.     frmMorph!picStorage(0).BackColor = BUTTON_GRAY
  498.     frmMorph!picStorage(1).BackColor = BUTTON_GRAY
  499.     frmMorph!picStorage(2).BackColor = BUTTON_GRAY
  500.     frmViewer!picIcons.BackColor = BUTTON_GRAY
  501.   
  502.   ' use white
  503.   Else
  504.     frmMorph!picSelectedIcon.BackColor = WHITE
  505.     frmMorph!picMorph(0).BackColor = WHITE
  506.     frmMorph!picMorph(1).BackColor = WHITE
  507.     frmMorph!picMorph(2).BackColor = WHITE
  508.     frmMorph!picMorph(3).BackColor = WHITE
  509.     frmMorph!picMorph(4).BackColor = WHITE
  510.     frmMorph!picMorph(5).BackColor = WHITE
  511.     frmMorph!picStorage(0).BackColor = WHITE
  512.     frmMorph!picStorage(1).BackColor = WHITE
  513.     frmMorph!picStorage(2).BackColor = WHITE
  514.     frmViewer!picIcons.BackColor = WHITE
  515.   End If
  516.  
  517.   ' refresh all icons
  518.   Call zzRefreshIcons
  519.  
  520. End Sub
  521.  
  522. Sub zzLoadIcon (ByVal sIcon$)
  523.   
  524.   ' load icon from file
  525.   frmMorph!picSelectedIcon.Picture = LoadPicture(sIcon)
  526.  
  527.   ' change caption
  528.   frmViewer.Caption = "[" & sIcon & "] Icon Viewer"
  529.   
  530.   ' refresh picture
  531.   frmMorph!picSelectedIcon.Refresh
  532.   
  533.   ' morph to bitmaps
  534.   Call zzMorphIcon(sIcon)
  535.  
  536. End Sub
  537.  
  538. Sub zzLoadIcons ()
  539.  
  540.  ' Description:
  541.  '  Show all icons
  542.  
  543.  ' Variables:
  544.   Dim nListCount As Integer
  545.   Dim nR         As Integer
  546.   Dim nX         As Integer
  547.   Dim sListCount As String
  548.  
  549.   ' make sure directory is current
  550.   If CurDir$ <> frmMorph!filList.Path Then
  551.     ChDir frmMorph!filList.Path
  552.   End If
  553.   
  554.   ' please wait...
  555.   Screen.MousePointer = HOURGLASS
  556.   
  557.   ' refresh to pick up new files
  558.   frmMorph!filList.Refresh
  559.  
  560.   ' is scroll bar needed
  561.   frmViewer!vsbIcons.Visible = frmMorph!filList.ListCount > gnIconsMax
  562.   
  563.   ' reset to top
  564.   frmViewer!vsbIcons.Value = 0
  565.  
  566.   ' display viewing window
  567.   frmViewer!picIcons.Visible = True
  568.  
  569.   ' get count of icons
  570.   nListCount = frmMorph!filList.ListCount
  571.      
  572.   ' setup "storage" bitmaps
  573.   If nListCount < 401 Then
  574.     frmMorph!picStorage(0).Width = nListCount * glICON_CELL
  575.     frmMorph!picStorage(1).Width = 1
  576.     frmMorph!picStorage(2).Width = 1
  577.   ElseIf frmMorph!filList.ListCount < 801 Then
  578.     frmMorph!picStorage(0).Width = 400 * glICON_CELL
  579.     frmMorph!picStorage(1).Width = (nListCount - 400) * glICON_CELL
  580.     frmMorph!picStorage(2).Width = 1
  581.   ElseIf frmMorph!filList.ListCount < 1201 Then
  582.     frmMorph!picStorage(0).Width = 400 * glICON_CELL
  583.     frmMorph!picStorage(1).Width = 400 * glICON_CELL
  584.     frmMorph!picStorage(2).Width = (nListCount - 800) * glICON_CELL
  585.   End If
  586.   
  587.   frmMorph!picStorage(0).Cls
  588.   frmMorph!picStorage(1).Cls
  589.   frmMorph!picStorage(2).Cls
  590.  
  591.   ' setup picture to act as "transporter" to bitmap
  592.   frmMorph!picSelectedIcon.Visible = False
  593.   frmMorph!picSelectedIcon.AutoRedraw = True
  594.  
  595.   ' setup and show counter
  596.   sListCount = " of " & Format$(nListCount) & " loaded"
  597.  
  598.   ' hide and show controls
  599.   frmMorph!lstFiles.Visible = False
  600.   frmMorph!picPrint.Visible = True
  601.   frmMorph!lstFiles.Refresh
  602.   frmMorph!picPrint.Refresh
  603.   
  604.   ' clear list box
  605.   frmMorph!lstFiles.Clear
  606.  
  607.   ' reset label
  608.   frmMorph!fraIcons.Caption = Format$(nListCount) + " &Icons"
  609.   frmMorph!fraIcons.Refresh
  610.  
  611.   ' if each icon in list
  612.   For nX = 0 To nListCount - 1
  613.  
  614.     ' print counter
  615.     frmMorph!picPrint.Cls
  616.     frmMorph!picPrint.Print Format$(nX + 1) & sListCount
  617.  
  618.     ' add file to list box
  619.     frmMorph!lstFiles.AddItem frmMorph!filList.List(nX)
  620.         
  621.     ' setup array reference
  622.     gtIcon(nX).nIndex = nX
  623.  
  624.     ' if not valid icon then display black square
  625.     If zzFileType(frmMorph!filList.List(nX), False) = gnTYPE_BAD Then
  626.  
  627.       ' copy into first storage area
  628.       If nX < 400 Then
  629.         nR = BitBlt(frmMorph!picStorage(0).hDC, 2 + nX * glICON_CELL, 0, 32, 32, 0, 0, 0, BLACKNESS)
  630.       
  631.       ' copy into second storage area
  632.       ElseIf nX < 800 Then
  633.         nR = BitBlt(frmMorph!picStorage(1).hDC, 2 + (nX - 400) * glICON_CELL, 0, 32, 32, 0, 0, 0, BLACKNESS)
  634.       
  635.       ' copy into third storage area
  636.       ElseIf nX < 1200 Then
  637.         nR = BitBlt(frmMorph!picStorage(2).hDC, 2 + (nX - 800) * glICON_CELL, 0, 32, 32, 0, 0, 0, BLACKNESS)
  638.       End If
  639.  
  640.     ' valid so display
  641.     Else
  642.  
  643.       ' load icon from file
  644.       frmMorph!picSelectedIcon.Picture = LoadPicture(frmMorph!filList.List(nX))
  645.       frmMorph!picSelectedIcon.Refresh
  646.  
  647.       ' copy into first storage area
  648.       If nX < 400 Then
  649.         nR = BitBlt(frmMorph!picStorage(0).hDC, 2 + nX * glICON_CELL, 0, 32, 32, frmMorph!picSelectedIcon.hDC, 0, 0, SRCCOPY)
  650.       
  651.       ' copy into second storage area
  652.       ElseIf nX < 800 Then
  653.         nR = BitBlt(frmMorph!picStorage(1).hDC, 2 + (nX - 400) * glICON_CELL, 0, 32, 32, frmMorph!picSelectedIcon.hDC, 0, 0, SRCCOPY)
  654.       
  655.       ' copy into third storage area
  656.       ElseIf nX < 1200 Then
  657.         nR = BitBlt(frmMorph!picStorage(2).hDC, 2 + (nX - 800) * glICON_CELL, 0, 32, 32, frmMorph!picSelectedIcon.hDC, 0, 0, SRCCOPY)
  658.       End If
  659.     
  660.     End If
  661.   
  662.   Next nX
  663.   
  664.   ' hide and show controls
  665.   frmMorph!lstFiles.Visible = True
  666.   frmMorph!picPrint.Visible = False
  667.   
  668.   ' ...done
  669.   Screen.MousePointer = DEFAULT
  670.  
  671.   ' redisplay selected icon picture
  672.   frmMorph!picSelectedIcon.Visible = True
  673.   frmMorph!picSelectedIcon.AutoRedraw = False
  674.  
  675.   ' set to first icon
  676.   If frmMorph!lstFiles.ListCount > 0 Then
  677.     frmMorph!lstFiles.ListIndex = 0
  678.   End If
  679.  
  680.   ' reset menu options
  681.   Call zzResetMenuOptions
  682.  
  683. End Sub
  684.  
  685. Sub zzMorphIcon (ByVal sIcon$)
  686.  
  687.  ' Description:
  688.  '  Morph single icon
  689.  
  690.  ' Parmeters:
  691.  '  sIcon                      icon to morph
  692.  
  693.  ' Variables:
  694.   Dim nR        As Integer     ' return code
  695.   Dim nX        As Integer     ' loop counter
  696.   
  697.   ' load picture
  698.   frmMorph!picSelectedIcon.Picture = LoadPicture(sIcon)
  699.   frmMorph!picSelectedIcon.Refresh
  700.       
  701.   ' morph 'em
  702.   For nX = 0 To 5
  703.     
  704.     ' use StrecthBlt
  705.     nR = StretchBlt(frmMorph!picMorph(nX).hDC, 0, 0, gnBMPx(nX), gnBMPy(nX), frmMorph!picSelectedIcon.hDC, 0, 0, 32, 32, SRCCOPY)
  706.  
  707.     ' refresh picture so it can be saved
  708.     frmMorph!picMorph(nX).Picture = frmMorph!picMorph(nX).Image
  709.     frmMorph!picMorph(nX).Refresh
  710.       
  711.   Next nX
  712.  
  713. End Sub
  714.  
  715. Sub zzMorphOne ()
  716.  
  717.  ' Variables:
  718.   Dim bCancel As Integer
  719.  
  720.   ' if one selected
  721.   If frmMorph!lstFiles.ListIndex >= 0 Then
  722.  
  723.     ' setup path
  724.     ChDrive frmMorph!drvList.Drive
  725.     ChDir frmMorph!filList.Path
  726.     
  727.     ' morph and save it
  728.     Call zzSaveIcon(frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex), bCancel)
  729.  
  730.   End If
  731.  
  732. End Sub
  733.  
  734. Sub zzOptionsFloat ()
  735.  
  736.   ' toggle switch
  737.   frmMorph!mnuOpFloat.Checked = Not frmMorph!mnuOpFloat.Checked
  738.  
  739.   ' float or sink
  740.   If frmMorph!mnuOpFloat.Checked Then
  741.     zzFormFloat frmMorph
  742.   Else
  743.     zzFormUnfloat frmMorph
  744.   End If
  745.  
  746. End Sub
  747.  
  748. Sub zzRefreshIcons ()
  749.  
  750.  ' Description:
  751.  '  Refresh icons
  752.  
  753.   ' can display up to 1200
  754.   If frmMorph!filList.ListCount > 1200 Then
  755.     MsgBox "Can only display up to a maximum of 1200 icons.", MB_ICONSTOP
  756.     
  757.   ' if ok number to show
  758.   Else
  759.     
  760.     ' load all the icons
  761.     zzLoadIcons
  762.     
  763.     ' display all the icons
  764.     zzDisplayIcons
  765.   
  766.     ' reset display
  767.     Call zzResizeViewer
  768.  
  769.   End If
  770.  
  771. End Sub
  772.  
  773. Sub zzRenameIcon ()
  774.  
  775.  ' Description:
  776.  '  Rename selected icon
  777.  
  778.  ' Variables:
  779.   Dim s1             As String
  780.   Dim sFileNew       As String
  781.   Dim sFileOld       As String
  782.   Dim sPath          As String
  783.  
  784.   ' handle errors
  785.   On Error Resume Next
  786.   
  787.   ' if entry selected
  788.   If frmMorph!lstFiles.ListIndex >= 0 Then
  789.  
  790.     ' setup file path and name
  791.     sPath = zzPathFormat(frmMorph!filList.Path)
  792.     sFileOld = frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex)
  793.  
  794.     ' if file not deleted
  795.     If sFileOld <> gsDELETED Then
  796.  
  797.       ' if the file exists
  798.       If zzFileExists(sPath & sFileOld) Then
  799.   
  800.         ' ask user to change
  801.         s1 = "Enter the new name for the " & UCase$(sFileOld) & " icon below:"
  802.         sFileNew = InputBox(s1, App.Title, sFileOld)
  803.   
  804.         ' if name entered and not same as last time
  805.         If sFileNew <> gsEMPTY And UCase$(sFileNew) <> UCase$(sFileOld) Then
  806.   
  807.           ' rename selected entry
  808.           Name sPath & sFileOld As sPath & sFileNew
  809.           
  810.           ' tell user of error
  811.           If Err <> 0 Then
  812.             s1 = UCase$(sFileOld) & " could not be renamed to "
  813.             s1 = s1 & UCase$(sFileNew) & " because of a """ & Error$ & """ error."
  814.             MsgBox s1, MB_ICONSTOP
  815.           
  816.           ' no error then rename in list
  817.           Else
  818.             frmMorph!lstFiles.List(frmMorph!lstFiles.ListIndex) = LCase$(sFileNew)
  819.           End If
  820.         
  821.         End If
  822.         
  823.       ' tell user not found
  824.       Else
  825.         MsgBox UCase$(sPath & sFileOld) & " not found.", MB_ICONSTOP
  826.       End If
  827.     ' file deleted
  828.     
  829.     Else
  830.       MsgBox "Icon has been deleted.", MB_ICONSTOP
  831.     End If
  832.     
  833.   End If
  834.  
  835. End Sub
  836.  
  837. Sub zzResetMenuOptions ()
  838.   
  839.   ' enable/disable menu options
  840.   frmMorph!mnuOpMorphOne.Enabled = frmMorph!lstFiles.ListIndex > -1
  841.   frmMorph!mnuOpCopy.Enabled = frmMorph!lstFiles.ListIndex > -1
  842.   frmMorph!mnuOpDelete.Enabled = frmMorph!lstFiles.ListIndex > -1
  843.   frmMorph!mnuOpRename.Enabled = frmMorph!lstFiles.ListIndex > -1
  844.   frmMorph!mnuOpShowAll.Enabled = frmMorph!lstFiles.ListCount > 0
  845.   frmMorph!mnuOpMorphAll.Enabled = frmMorph!lstFiles.ListCount > 0
  846.  
  847. End Sub
  848.  
  849. Sub zzResizeViewer ()
  850.  
  851.  ' Description:
  852.  '  Resize and reposition controls
  853.  
  854.  ' Variables:
  855.   Dim nDiff As Integer    ' difference between maximum number of
  856.                           ' icons that can be shown and number to show
  857.  
  858.   ' do nothing if minimized
  859.   If frmViewer.WindowState <> MINIMIZED Then
  860.  
  861.     ' if form to small
  862.     If (frmViewer.Width < gnWidthViewerMin) Or (frmViewer.Height < gnHeightViewerMin) Then
  863.  
  864.       ' determine new width
  865.       If frmViewer.Width < gnWidthViewerMin Then gnWidthViewerNew = gnWidthViewerMin Else gnWidthViewerNew = frmViewer.Width
  866.       
  867.       ' determine new height
  868.       If frmViewer.Height < gnHeightViewerMin Then gnHeightViewerNew = gnHeightViewerMin Else gnHeightViewerNew = frmViewer.Height
  869.       
  870.       ' reset form
  871.       frmViewer.Move frmViewer.Left, frmViewer.Top, gnWidthViewerNew, gnHeightViewerNew
  872.  
  873.     ' form big enough so
  874.     Else
  875.  
  876.       ' save new settings
  877.       gnHeightViewerNew = frmViewer.Height
  878.       gnWidthViewerNew = frmViewer.Width
  879.  
  880.       ' recalculate columns, rows, and maximum
  881.       ' assuming no scroll bar
  882.       gnIconCols = frmViewer.ScaleWidth \ glICON_CELL
  883.       gnIconRows = frmViewer.ScaleHeight \ glICON_CELL
  884.       gnIconsMax = gnIconCols * gnIconRows
  885.  
  886.       ' reset scroll values
  887.       frmViewer!vsbIcons.Value = 0
  888.       frmViewer!vsbIcons.Max = 0
  889.       
  890.       ' if all icons cannot be displayed
  891.       If frmMorph!lstFiles.ListCount > gnIconsMax Then
  892.     
  893.         ' show scroll bar
  894.         frmViewer!vsbIcons.Visible = True
  895.       
  896.         ' position scroll bar
  897.         frmViewer!vsbIcons.Left = frmViewer.ScaleWidth - frmViewer!vsbIcons.Width
  898.         frmViewer!vsbIcons.Top = 0
  899.         frmViewer!vsbIcons.Height = frmViewer.ScaleHeight
  900.     
  901.         ' position viewer area
  902.         frmViewer!picIcons.Width = frmViewer!vsbIcons.Left - 1
  903.         frmViewer!picIcons.Height = frmViewer.ScaleHeight
  904.  
  905.         ' recalc columns and maximum
  906.         gnIconCols = frmViewer!vsbIcons.Left \ glICON_CELL
  907.         gnIconsMax = gnIconCols * gnIconRows
  908.         
  909.         ' calc difference
  910.         nDiff = frmMorph!lstFiles.ListCount - gnIconsMax
  911.        
  912.         ' set maximum scroll value
  913.         frmViewer!vsbIcons.Max = nDiff \ gnIconCols
  914.         If (nDiff Mod gnIconCols) Then frmViewer!vsbIcons.Max = frmViewer!vsbIcons.Max + 1
  915.        
  916.         ' set big scroll value
  917.         frmViewer!vsbIcons.LargeChange = gnIconRows
  918.  
  919.       ' all icons can be shown
  920.       Else
  921.  
  922.         ' hide scroll bar
  923.         frmViewer!vsbIcons.Visible = False
  924.       
  925.         ' position viewer area
  926.         frmViewer!picIcons.Width = frmViewer.ScaleWidth
  927.         frmViewer!picIcons.Height = frmViewer.ScaleHeight
  928.     
  929.       End If
  930.  
  931.       ' update viewing area
  932.       If frmMorph!lstFiles.ListCount > 0 Then
  933.         If Not gbLoading Then zzDisplayIcons
  934.       End If
  935.  
  936.       ' float main form so it doesn't disappear
  937.       If frmViewer.WindowState = MAXIMIZED Then
  938.         If Not frmMorph!mnuOpFloat.Checked Then
  939.           Call zzOptionsFloat
  940.         End If
  941.       End If
  942.  
  943.     End If
  944.   
  945.   End If
  946.   
  947. End Sub
  948.  
  949. Sub zzSaveIcon (ByVal sIcon$, bCancel%)
  950.  
  951.  ' Description:
  952.  '  Save single icon
  953.  
  954.  ' Parmeters:
  955.  '  sIcon                      icon to morph
  956.  '  bSave                      save file to disk
  957.  '  bCancel                    cancel flag
  958.  
  959.  ' Variables:
  960.   Dim bWrite        As Integer     ' write flag
  961.   Dim nR            As Integer     ' return code
  962.   Dim sFileName     As String      ' file name
  963.  
  964.   ' if icon has been deleted
  965.   If sIcon$ <> gsDELETED Then
  966.  
  967.     ' if this is an icon
  968.     If zzFileType(sIcon, False) = gnTYPE_ICON Then
  969.   
  970.       ' format file name
  971.       sFileName = Left$(sIcon, Len(sIcon) - 3) + "bmp"
  972.   
  973.       ' save to application directory
  974.       If frmMorph!mnuOpSaveAppDir.Checked Then
  975.         sFileName = App.Path & "\" & sFileName
  976.       End If
  977.       
  978.       ' if warning and saving to file
  979.       If gbWarning Then
  980.   
  981.         ' if file exists handle options
  982.         If zzFileExists(sFileName) Then
  983.   
  984.           ' ask user
  985.           nR = MsgBox(UCase$(sFileName) & " already exists. Do you wish to overwrite the file?", MB_ICONQUESTION Or MB_YESNOCANCEL)
  986.           
  987.           ' cancel
  988.           If nR = IDCANCEL Then bCancel = True: Exit Sub
  989.           
  990.           ' write anyway?
  991.           bWrite = (nR = IDYES)
  992.         
  993.         ' write if it doesn't exist
  994.         Else
  995.           bWrite = True
  996.         End If
  997.   
  998.       ' write without warning
  999.       Else
  1000.         bWrite = True
  1001.       End If
  1002.   
  1003.       ' if writing
  1004.       If bWrite Then
  1005.       
  1006.         ' load picture
  1007.         frmMorph!picSelectedIcon.Picture = LoadPicture(sIcon)
  1008.         frmMorph!picSelectedIcon.Refresh
  1009.         
  1010.         ' stretch it
  1011.         nR = StretchBlt(frmMorph!picMorph(gnBMP).hDC, 0, 0, gnBMPx(gnBMP), gnBMPy(gnBMP), frmMorph!picSelectedIcon.hDC, 0, 0, 32, 32, SRCCOPY)
  1012.   
  1013.         ' refresh picture o it can be saved
  1014.         frmMorph!picMorph(gnBMP).Picture = frmMorph!picMorph(gnBMP).Image
  1015.         frmMorph!picMorph(gnBMP).Refresh
  1016.         
  1017.         ' save bitmap
  1018.         SavePicture frmMorph!picMorph(gnBMP).Picture, sFileName
  1019.   
  1020.       End If
  1021.     
  1022.     ' not an icon
  1023.     Else
  1024.        MsgBox "Selected file must be an icon.", MB_ICONSTOP
  1025.     End If
  1026.  
  1027.   ' icon deleted
  1028.   Else
  1029.      MsgBox "Selected Icon has been deleted.", MB_ICONSTOP
  1030.   End If
  1031.   
  1032. End Sub
  1033.  
  1034. Sub zzSaveIcons ()
  1035.  
  1036.  ' Description:
  1037.  '  Save Icons
  1038.  
  1039.  ' Variables:
  1040.   Dim bCancel   As Integer     ' cancel
  1041.   Dim nX        As Integer     ' loop counter
  1042.   
  1043.   ' change to path
  1044.   ChDrive frmMorph!drvList.Drive
  1045.   ChDir frmMorph!filList.Path
  1046.  
  1047.   ' please wait...
  1048.   Screen.MousePointer = HOURGLASS
  1049.  
  1050.   ' make sure above all other forms
  1051.   zzFormFloat frmMorph
  1052.   
  1053.   ' if each icon in list
  1054.   For nX = 0 To frmMorph!lstFiles.ListCount - 1
  1055.     
  1056.     ' if valid icon then
  1057.     If zzFileType(frmMorph!lstFiles.List(nX), True) = gnTYPE_ICON Then
  1058.       
  1059.       ' save icon
  1060.       Call zzSaveIcon(frmMorph!lstFiles.List(nX), bCancel)
  1061.       
  1062.       ' user cancelled
  1063.       If bCancel Then Exit For
  1064.  
  1065.     End If
  1066.  
  1067.   Next nX
  1068.  
  1069.   ' sink back
  1070.   If Not frmMorph!mnuOpFloat.Checked Then
  1071.     zzFormUnfloat frmMorph
  1072.   End If
  1073.   
  1074.   ' ...done
  1075.   Screen.MousePointer = DEFAULT
  1076.  
  1077.   ' set to first icon
  1078.   If frmMorph!lstFiles.ListCount > 0 Then
  1079.     frmMorph!lstFiles.ListIndex = -1
  1080.     frmMorph!lstFiles.ListIndex = 0
  1081.   End If
  1082.  
  1083. End Sub
  1084.  
  1085. Sub zzViewerToggle ()
  1086.   
  1087.   ' toggle
  1088.   frmMorph!mnuOpViewer.Checked = Not frmMorph!mnuOpViewer.Checked
  1089.   
  1090.   ' show/hide viewer
  1091.   If frmMorph!mnuOpViewer.Checked Then
  1092.     frmViewer.Show
  1093.   Else
  1094.     frmViewer.Hide
  1095.   End If
  1096.  
  1097. End Sub
  1098.  
  1099.